//
// TCP Sokect 管理
// Created by kenny on 25-10-16.
//
#ifndef TCP_SOCKET_MANAGER_H
#define TCP_SOCKET_MANAGER_H

#include <stdint.h>
#include <stdbool.h>

#ifdef _WIN32
    #include <winsock2.h>
    typedef SOCKET socket_t;
#else
typedef int socket_t;
#define INVALID_SOCKET (-1)
#define SOCKET_ERROR (-1)
#endif

// 定义回调函数类型
typedef void (*recv_callback_t)(uint8_t* data, uint16_t length);
typedef void (*connection_status_callback_t)(bool connected, const char* reason);

// 重连配置
typedef struct {
    int max_retries;           // 最大重试次数
    int retry_delays[5];       // 重连延迟（秒）
    int current_retry_count;   // 当前重试次数
} reconnect_config_t;

// Socket管理器
typedef struct {
    socket_t socket_fd;
    char server_ip[16];
    int server_port;
    bool is_connected;
    bool should_reconnect;
    bool manual_close;

    reconnect_config_t reconnect_config;

    // 非阻塞连接超时配置
    int connect_timeout_sec;  // 连接超时时间（秒）

    // 回调函数
    recv_callback_t recv_callback;
    connection_status_callback_t status_callback;

    // 线程相关
#ifdef _WIN32
    HANDLE recv_thread;
    HANDLE send_thread;
    CRITICAL_SECTION send_lock;
#else
    pthread_t recv_thread;
    pthread_t send_thread;
    pthread_mutex_t send_lock;
#endif

    bool running;
} mcp_tcp_t;

// API函数
int mcp_tcp_init(mcp_tcp_t* manager, const char* ip, int port,
                       recv_callback_t recv_cb, connection_status_callback_t status_cb);
int mcp_tcp_connect(mcp_tcp_t* manager);
int mcp_tcp_send(mcp_tcp_t* manager, const uint8_t* data, uint16_t length);
int mcp_tcp_close(mcp_tcp_t* manager);
bool mcp_tcp_is_connected(mcp_tcp_t* manager);
void mcp_tcp_cleanup(mcp_tcp_t* manager);

#endif // TCP_SOCKET_MANAGER_H
